612. Сортировка ДНК
Величиной строки будем
называть количество инверсий в ней. В задаче требуется отсортировать набор
строк одинаковой длины по неубыванию их величин.
Вход. Первая строка содержит количество тестов M, после
которой следует пустая строка. Первая строка каждого теста содержит длину n (0 < n £ 50) и количество m
(0 < m £ 100) строк.
Далее следуют m строк длины n. Входные тесты разделяются пустой
строкой.
Выход. Для
каждого теста вывести последовательность строк от «наиболее отсортированных» до
«наименее отсортированных», то есть по неубыванию количества инверсий в них.
Для строк с одинаковым числом инверсий сохранить входной порядок. Между тестами
выводить пустую строку.
1
10 6
AACATGAAGG
TTTTGGCCAA
TTTGGCCAAA
GATCAGATTT
CCCGGGGGGA
ATCGATGCAT
CCCGGGGGGA
AACATGAAGG
GATCAGATTT
ATCGATGCAT
TTTTGGCCAA
TTTGGCCAAA
сортировка
Для каждой строки вычислим
число инверсий в ней. Это число вместе с самой строкой храним в векторе пар.
Выполняем стабильную сортировку строк в порядке неубывания количества инверсий
в них и выводим результат.
Строки вместе с количеством инверсий в них храним в векторе
пар s.
vector<pair<string,int> > s;
Функция value вычисляет количество инверсий в строке s.
int value(string s)
{
int i, j, res = 0;
for(i = 0; i < n - 1; i++)
for(j = i + 1; j < n; j++)
if (s[i] > s[j]) res++;
return res;
}
Функция lt используется в стабильной сортировке строк.
int lt(pair<string,int> x, pair<string,int>
y)
{
return (x.second < y.second);
}
Основной цикл программы. Читаем количество входных
тестов tests.
scanf("%d",&tests);
while(tests--)
{
s.clear();
Для каждого теста читаем значения n и m. Для каждой строки
вычисляем число инверсий в ней, заносим их структуру типа DNA и сохраняем в векторе s.
scanf("%d %d\n",&n,&m);
for(i = 0; i < m; i++)
{
gets(stroka);
s.push_back(make_pair(stroka,value(stroka)));
}
Проводим стабильную сортировку строк.
stable_sort(s.begin(),s.end(),lt);
Выводим результат. Между тестами выводим пустую
строку.
for(iter = s.begin();iter != s.end();iter++)
puts((*iter).first.c_str());
if (tests) printf("\n");
}